package com.vrp3d.common.utils;

import com.vrp3d.common.enums.CommonEnum;
import com.vrp3d.common.enums.CommonExceptionEnum;
import com.vrp3d.common.exceptions.CommonException;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.io.FileUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.IOException;

/**
 * 文件工具类
 *
 * @author vrp3d
 */
@Slf4j
public class FileUtil {

    private static String fileRootPath = CommonEnum.FOLDER_ROOT.getMsg();

    /**
     * 上传文件
     *
     * @param file         待上传文件
     * @param targetFolder 目标文件夹(会在改文件夹之前拼接上temp/)
     * @return 最终上传目录
     */
    public static String uploadFile(MultipartFile file, String targetFolder) {
        //设置文件名称
        String fileName = file.getOriginalFilename();
        if (StringUtils.isBlank(fileName)) {
            throw new CommonException(CommonExceptionEnum.FILE_NAME_IS_EMPTY);
        }
        log.info("上传文件:{}", fileName);
        //所有文件上传至临时文件夹,待保存时再复制到相应文件夹
        String filePath = targetFolder + fileName;
        //文件夹是否存在,不存在就创建
        File dir = new File(targetFolder);
        if (!dir.exists()) {
            dir.mkdirs();
        }
        File target = new File(filePath);
        try {
            file.transferTo(target);
        } catch (IOException e) {
            log.error("写入磁盘失败" + e.getMessage());
            throw new CommonException(CommonExceptionEnum.FILE_UPLOAD_FAILED);
        }
        //返回的路径,不带"/root"根路径
        String result = filePath.substring(fileRootPath.length());
        log.info("上传文件成功:{}", result);
        return result;
    }

    /**
     * 判断文件是否存在
     *
     * @param filePath 待判断文件完整路径
     * @return 是否存在
     */
    public static boolean fileExists(String filePath) {
        filePath = fileRootPath + filePath;
        File file = new File(filePath);
        return file.exists();
    }

    /**
     * 移动文件
     *
     * @param sourceFilePath 待移动文件
     * @param targetFilePath 移动目标文件夹
     * @return
     */
    public static String moveFileToDirectory(String sourceFilePath, String targetFilePath) {
        log.info("移动文件,源文件:{},目标文件夹:{}", sourceFilePath, targetFilePath);
        //源文件
        File sourceFile = new File(fileRootPath + sourceFilePath);
        //目标文件夹
        File targetFile = new File(fileRootPath + targetFilePath);
        //移动文件到文件夹
        try {
            //true的含义是文件夹不存在时,就创建文件夹
            FileUtils.moveFileToDirectory(sourceFile, targetFile, true);
            return targetFilePath + sourceFilePath.substring(sourceFilePath.lastIndexOf(CommonEnum.SEPARATOR_SLASH.getMsg()));
        } catch (IOException e) {
            log.error("从临时文件夹移动文件失败,源文件:{},目标文件夹:{}", sourceFilePath, targetFilePath);
            e.printStackTrace();
            return null;
        }
    }

    /**
     * 删除文件 软删除 移动至对应文件夹
     *
     * @param filePath       待删除文件
     * @param targetFilePath 目标文件夹
     */
    public static void deleteFile(String filePath, String targetFilePath) {
        //待删除文件
        File sourceFile = new File(fileRootPath + filePath);
        //目标文件夹
        File targetFile = new File(targetFilePath);
        //移动文件到文件夹
        try {
            //true的含义是文件夹不存在时,就创建文件夹
            FileUtils.moveFileToDirectory(sourceFile, targetFile, true);
            log.info("删除文件,{},转移至文件夹:{}", sourceFile, targetFile);
        } catch (IOException e) {
            log.info("删除文件时出错,待删除文件路径:{}", filePath);
        }
    }
}
